package com.cskaoyan.generator;

import com.cskaoyan.bean.LiuShifu;
import com.cskaoyan.bean.LiushifuInterface;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyGenerator {

    //配置working directory → 默认值为project路径
    //可以修改为module路径
    public static void main(String[] args) {
        //将字节码文件保存下来
        //ProxyGenerator → saveGeneratedFiles
        System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles","true");

        LiuShifu liuShifu = new LiuShifu();
        //第一个参数：类加载器
        //第二个参数：接口的数组 → jdk动态代理的委托类要有接口的实现
        //第三个参数：InvocationHandler → 类似于我们前面写的ProxySupport
        //                invoke:执行委托类的方法、增强
        //jdk动态代理要以接口来接收代理对象
        LiushifuInterface proxy = (LiushifuInterface) Proxy.newProxyInstance(LiuShifu.class.getClassLoader(),
                LiuShifu.class.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //委托类方法的执行
                        //method.invoke(proxy, args);
                        // 调用代理对象的方法 → 调用到invoke → 调用了代理对象的方法 → 调用到invoke 。。。。。。
                        String name = method.getName();
                        System.out.println(name);
                        Object invoke = method.invoke(liuShifu, args);
                        //增强
                        System.out.println("五根大烤肠");
                        return invoke;
                    }
                });//生成一个代理对象
        proxy.buyBreakfast();//执行InvocationHandler的invoke方法
        proxy.buyLunch(); //执行InvocationHandler的invoke方法
        proxy.buyLittleNight("烧烤","火锅");//执行InvocationHandler的invoke方法
    }
}
